package com.wushijia.designpatterns.single;

/**
 * 单例设计模式：双重校验，懒汉式（饿汉式会过早加载，如果存在占用内存比较大的类对象，会在堆内存中存在较长时间）
 */
//不允许继承
public final class SingleTest implements Runnable {

  //加volatile禁止指令重排序，防止对象分配完内存空间，还未初始化时被使用
  //mySingle = new MySingle();正确执行路径分为1、分配对象的内存空间；2、初始化对象；3、设置刚指向的内存空间，指令重排序会导致2，3调换
  private volatile static MySingle mySingle = null;

  public MySingle getInstance() {
    //提高效率
    if (mySingle == null) {
      synchronized (this) { //减小锁粒度，比在方法上加synchronized要好
        if (mySingle == null) {
          mySingle = new MySingle();
        }
      }
    }
    return mySingle;
  }

  public static void main(String[] args) {
    Runnable runnable = new SingleTest();
    Thread singleTest1 = new Thread(runnable);
    Thread singleTest2 = new Thread(runnable);
    singleTest1.start();
    singleTest2.start();
  }

  @Override
  public void run() {
    System.out.println(getInstance());
  }

  //防止getInstance方法外使用new创建对象
  private static class MySingle {

  }
}
